home *** CD-ROM | disk | FTP | other *** search
- /* cat > headers/plot3d.h << "EOF" */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* plot3d.h: header for plot3d.c file */
- /* 3-D plotting in the imagetool. We use the */
- /* floating horizon algorithm to remove hiden */
- /* lines. Arbitrary 3-D rotation is possible */
- /* by setting up different transformation */
- /* matrix. Currently, the rotation is about */
- /* y-axis first and then x-axis, z-axis. The */
- /* constant PRECISION in const.h is to */
- /* define the accuracy of line intersections. */
- /* The bigger the PRECISION, the slower the */
- /* algorithm. For window of N pixels, it */
- /* makes no sence to assign PRECISION larger */
- /* than N. For laser printers, that is a */
- /* different story. */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* SCCS information: %W% %G% - NCSA */
-
- #define plot3d_h 1
-
- #include "all.h"
- #include "newext.h"
-
- static Point v[8];
-
- /* EOF */
- /* cat > src+obj/plot3d/plot3d.c << "EOF" */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* plot3d: main 3-D plotting routine */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* SCCS information: %W% %G% - NCSA */
-
- /* #include "plot3d.h" */
-
- void
- plot3d (datx, daty, datap)
- int datx, daty;
- Point *datap;
- {
- register i, j;
- register Point *dp;
- Point pp, pv, **data;
- float minx, maxx, miny, maxy, minz, maxz;
- float factor, tmp;
- int front;
-
- /* Dynamically allocate spaces for the data array */
- data = (Point **) calloc (daty, sizeof (Point *));
- if (data == NULL)
- {
- msg_write ("Error: Not enough memory to hold plot data matrix.");
- return;
- }
- data[0] = datap;
- for (i = 1; i < daty; i++)
- {
- data[i] = data[i - 1] + datx;
- }
-
- minx = data[0][0].x;
- maxx = data[0][datx - 1].x;
- miny = LARGE;
- maxy = -LARGE;
- factor = (maxx - minx) * 0.00347826;
- for (j = 0; j < daty; j++)
- {
- for (i = 0; i < datx; i++)
- { /* change rotation system */
- dp = &data[j][i];
- tmp = dp->y;
- dp->y = -(dp->z) * factor;
- dp->z = -tmp;
-
- miny = MIN (miny, dp->y);
- maxy = MAX (maxy, dp->y);
- }
- }
- maxz = data[0][0].z;
- minz = data[daty - 1][0].z;
-
- if (draw_init () != 0)
- return;
- front = plot3d_init (minx, maxx, miny, maxy, minz, maxz);
- plot3d_cube (front, 0); /* plot front lines of the cube */
-
- if (front >= 4)
- { /* plot from first row to last */
- xform (&pp, &data[0][0]); /* 4-7 are the front vertices */
- gfx_move (pp.x, pp.y);
- daty--;
- for (i = 0; i < daty; i++)
- {
- for (j = 0; j < datx; j++)
- { /* go this way */
- xform (&pp, &data[i][j]); /* __________| */
- gfx_vector (pp.x, pp.y, 1); /* | */
- }
- xform (&pp, &data[i + 1][datx - 1]);
- gfx_vector (pp.x, pp.y, 1);
-
- xform (&pp, &data[i][0]);
- gfx_move (pp.x, pp.y);
- }
-
- for (j = 0; j < datx; j++)
- { /* the last row */
- xform (&pp, &data[daty][j]);
- gfx_vector (pp.x, pp.y, 1);
- }
- daty++;
- }
- else
- { /* plot in the other way round */
- xform (&pp, &data[daty - 1][datx - 1]);
- gfx_move (pp.x, pp.y);
- for (i = daty - 1; i > 0; i--)
- {
- for (j = datx - 1; j >= 0; j--)
- {
- xform (&pp, &data[i][j]);
- gfx_vector (pp.x, pp.y, 1);
- }
- xform (&pp, &data[i - 1][0]);
- gfx_vector (pp.x, pp.y, 1);
-
- xform (&pp, &data[i][datx - 1]);
- gfx_move (pp.x, pp.y);
- }
-
- for (j = datx - 1; j >= 0; j--)
- { /* the last row */
- xform (&pp, &data[0][j]);
- gfx_vector (pp.x, pp.y, 1);
- }
- }
- plot3d_cube (front, 1); /* hiden lines of the cube */
-
- draw_done ();
- free (data);
- }
- /* EOF */
- /* cat > src+obj/plot3d/plot3d_cube.c << "EOF" */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* plot3d_cube: plot 3-D cube */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* SCCS information: %W% %G% - NCSA */
-
- /* #include "plot3d.h" */
- void
- plot3d_cube (front, flag)
- int front, flag;
- {
- Point v0, v1, v2, v3, v4, v5, v6, v7;
-
- v0 = v[0 ^ front];
- v1 = v[1 ^ front]; /* remember hypercube ? */
- v2 = v[2 ^ front];
- v3 = v[3 ^ front]; /* play tricks on binary numbers */
- v4 = v[4 ^ front];
- v5 = v[5 ^ front];
- v6 = v[6 ^ front];
- v7 = v[7 ^ front];
-
- if (!flag)
- { /* front lines */
- gfx_line (v0.x, v0.y, v1.x, v1.y, 0);
- gfx_line (v0.x, v0.y, v2.x, v2.y, 0);
- gfx_line (v0.x, v0.y, v4.x, v4.y, 0);
-
- gfx_line (v3.x, v3.y, v1.x, v1.y, 0);
- gfx_line (v3.x, v3.y, v2.x, v2.y, 0);
-
- gfx_line (v5.x, v5.y, v1.x, v1.y, 0);
- gfx_line (v5.x, v5.y, v4.x, v4.y, 0);
-
- gfx_line (v6.x, v6.y, v2.x, v2.y, 0);
- gfx_line (v6.x, v6.y, v4.x, v4.y, 0);
- }
- else
- { /* hiden lines */
- gfx_line (v3.x, v3.y, v7.x, v7.y, 1);
- gfx_line (v5.x, v5.y, v7.x, v7.y, 1);
- gfx_line (v6.x, v6.y, v7.x, v7.y, 1);
- }
- }
- /* EOF */
- /* cat > src+obj/plot3d/plot3d_init.c << "EOF" */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* plot3d_init: initialize 3-D plotting */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* SCCS information: %W% %G% - NCSA */
-
- /* #include "plot3d.h" */
-
- plot3d_init (minx, maxx, miny, maxy, minz, maxz)
- float minx, maxx, miny, maxy, minz, maxz;
- {
- float h_minx, h_maxx, h_miny, h_maxy; /* calculation space */
- float w_minx, w_maxx, w_miny, w_maxy; /* current window space */
- float minimum_z, tmp; /* for drawing cube */
- Point pp, pv[8]; /* cube vertices */
- int i, front_vertex; /* of the cube */
-
- setvrp ((maxx - minx) / 2.0 + minx, /* view reference point */
- (maxy - miny) / 2.0 + miny,
- (maxz - minz) / 2.0 + minz);
- setxform (); /* transformation matrix */
- gfx_init (); /* setup scale to widow size */
-
- pv[0].x = minx;
- pv[0].y = miny;
- pv[0].z = minz; /* the cube */
- pv[1].x = maxx;
- pv[1].y = miny;
- pv[1].z = minz;
- pv[2].x = minx;
- pv[2].y = maxy;
- pv[2].z = minz;
- pv[3].x = maxx;
- pv[3].y = maxy;
- pv[3].z = minz;
- pv[4].x = minx;
- pv[4].y = miny;
- pv[4].z = maxz;
- pv[5].x = maxx;
- pv[5].y = miny;
- pv[5].z = maxz;
- pv[6].x = minx;
- pv[6].y = maxy;
- pv[6].z = maxz;
- pv[7].x = maxx;
- pv[7].y = maxy;
- pv[7].z = maxz;
-
- for (i = 0; i < 8; i++)
- {
- xform (&v[i], &pv[i]); /* cube in calculation space */
- pp = v[i];
- zform (&pp); /* in real space after rotation */
-
- if (i == 0)
- { /* find out boundary sizes */
- h_minx = h_maxx = v[i].x; /* for both spaces and the */
- h_miny = h_maxy = v[i].y; /* front vertex number */
- minimum_z = v[i].z;
- front_vertex = 0;
-
- w_minx = w_maxx = pp.x;
- w_miny = w_maxy = pp.y;
- }
- else
- {
- tmp = v[i].x;
- if (tmp < h_minx)
- h_minx = tmp;
- else if (tmp > h_maxx)
- h_maxx = tmp;
-
- tmp = v[i].y;
- if (tmp < h_miny)
- h_miny = tmp;
- else if (tmp > h_maxy)
- h_maxy = tmp;
-
- tmp = v[i].z;
- if (tmp < minimum_z)
- {
- minimum_z = tmp;
- front_vertex = i;
- }
-
- tmp = pp.x;
- if (tmp < w_minx)
- w_minx = tmp;
- else if (tmp > w_maxx)
- w_maxx = tmp;
-
- tmp = pp.y;
- if (tmp < w_miny)
- w_miny = tmp;
- else if (tmp > w_maxy)
- w_maxy = tmp;
- }
- }
-
- hid_scale (h_minx, h_maxx, h_miny, h_maxy); /* scale calculation space */
- win_scale (w_minx, w_maxx, w_miny, w_maxy); /* scale curr window space */
- return (front_vertex);
- }
- /* EOF */
- /* cat > src+obj/plot3d/plot_threed.c << "EOF" */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* plot_threed: 3-D plotting routine */
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- /* SCCS information: %W% %G% - NCSA */
-
- /* #include "plot3d.h" */
-
- void
- plot_threed ()
- {
- Point *matrix; /* hold data to be plotted */
- int xdim = curr_image.xdim; /* box dimentions */
- int ydim = curr_image.ydim;
- int xpos = curr_image.startx;
- int ypos = curr_image.starty;
- int tmp;
-
- clear_plot ();
- tmp = (xdim + 1) >> 1; /* average data points */
- /* to speed up plotting */
- if ((matrix = (Point *) malloc (tmp * ydim * sizeof (Point))) == NULL)
- {
- msg_write ("Error: Not enough memory to hold plot data matrix.");
- return;
- }
- if (get_matrix (matrix, xdim, ydim, xpos, ypos) != 0)
- return;
-
- plot3d (tmp, ydim, matrix); /* do the real work */
- free (matrix);
- }
- /* EOF */
-